package cn.doitedu.rule.engine.functions;

import cn.doitedu.rule.engine.beans.EventBean;
import cn.doitedu.rule.engine.beans.RuleConditions;
import cn.doitedu.rule.engine.beans.RuleMatchResult;
import cn.doitedu.rule.engine.utils.EventParamComparator;
import cn.doitedu.rule.engine.utils.RuleMonitor;
import org.apache.commons.lang3.RandomUtils;
import org.apache.flink.streaming.api.functions.KeyedProcessFunction;
import org.apache.flink.util.Collector;

/**
 * @author 涛哥
 * @nick_name "deep as the sea"
 * @contact qq:657270652 wx:doit_edu
 * @site www.doitedu.cn
 * @date 2021-07-23
 * @desc 规则匹配计算核心函数
 *
 * 规则：
 *   触发事件：  K事件，事件属性（ p2=v1 ）
 *   画像属性条件: tag87=v2, tag26=v1
 *   行为次数条件： 2021-06-18 ~ 当前 , 事件 C [p6=v8,p12=v5] 做过 >= 2次
 *
 */
public class RuleMatchKeyedProcessFunction extends KeyedProcessFunction<String, EventBean, RuleMatchResult> {

    @Override
    public void processElement(EventBean event, Context ctx, Collector<RuleMatchResult> out) throws Exception {

        // 获取规则
        RuleConditions rule = RuleMonitor.getRule();

        // 判断当前事件是否是规则定义的触发事件条件
        if(!EventParamComparator.compare(rule.getTriggerEvent(),event)) return;


        // TODO 计算画像条件是否满足




        // TODO 行为次数条件是否满足




        // TODO 行为序列条件是否满足




        // TODO 模拟随机命中
        if(RandomUtils.nextInt(1,10)%3==0){
            RuleMatchResult ruleMatchResult = new RuleMatchResult(event.getDeviceId(), rule.getRuleId(), event.getTimeStamp(), System.currentTimeMillis());
            out.collect(ruleMatchResult);
        }

    }


}
